﻿using System;
using System.Windows.Forms;

namespace Routing
{
	class NODE
	{
        // DEFINE classes   ***********************************************************************
        COMMON CM = new COMMON();

        // DEFINE const ***************************************************************************
        public  const   int TNODE   = 100;  // 전체 노드 수
        public  const   int KCNT    = 4;    // 한 노드가 소유할 키 수
        public  const   int RANGE   = 200;  // 노드가 수신할 수 있는 범위
        public  const   int SEED    = 1;

        // Nodes Information    *******************************************************************
		public  int     nodeID;				// 노드 식별자
		public  float   nodeX;				// 노드 X좌표
		public  float   nodeY;				// 노드 Y좌표
		public  int     parentID = -1;   	// 부모 식별자
        public  float   distance;           // BS로부터 노드간 거리
        public  int     hc;                 // Hop Count
        public  bool    state;              // 다른 노드간 연결 상태(True-연결됨, False-안됨)
        public  int     keyIdx;

        public  int     key;
        public  int[]   keyPool;
        public  int[]   tmpKeyPool;

        Random randomObject = new Random( SEED );

        // NODE Class 초기화   ********************************************************************
        public NODE()
        {
            nodeID      = -1;
            nodeX       = -1;
            nodeY       = -1;
            parentID    = -1;
            distance    = -1.0f;
            hc          = 0;
            state       = false;
            

            keyPool     = new int[KCNT];
            tmpKeyPool  = new int[KCNT];

            DistributeKeys();
        } // public NODE()


        // 노드 만들기 on Background ***************************************************************
        public void MakeNodes( NODE nd, int id )
        {
            nd.nodeID   = id;
            nd.nodeX    = ( float )( ( randomObject.Next() % 1400 ) * 0.7 );
            nd.nodeY    = ( float )( ( randomObject.Next() % 1100 ) * 0.7 );
            nd.key      = ( int )( randomObject.Next() % 20 );
        } // public void MakeNodes( NODE nd, int id )


        // 노드 사이 거리 측정  ********************************************************************
        public float MeasureDistance( float x1, float y1, float x2, float y2 )
        {
            return ( float )Math.Sqrt( ( ( x1 - x2 ) * ( x1 - x2 ) ) + ( ( y1 - y2 ) * ( y1 - y2 ) ) );
        } // public float MeasureDistance


        // 키분배작업    ***************************************************************************
        public void DistributeKeys()
        {
            int tmp = -1;

            keyIdx = randomObject.Next() % 20;

            for (int i = 0; i < 4; i++)
            {
                tmp             = PutRandomKeys();
                keyPool[i]      = ChkOverlapKeys( tmp );
                tmpKeyPool[i]   = keyPool[i];
            }
        } // public void DistributeKeys()


        // 파티션에서 임의의 키 분배   **************************************************************
        public int PutRandomKeys()
        {
            int tmp = -1;

            tmp = (keyIdx * 10) + randomObject.Next() % 10 + 1;

            return tmp;
        } // public int PutRandomKeys()


        // 중복키 처리   ***************************************************************************
        public int ChkOverlapKeys( int tmp )
        {
            for ( int i = 0; i < 4; i++ )
            {
                if ( tmpKeyPool[i] == tmp)
                {
                    tmp = PutRandomKeys();
                    ChkOverlapKeys( tmp );
                }
            }

            return tmp;
        } // public int ChkOverlapKeys( int tmp )
	} // class
}
